rbtree: Make node getters not require tree argument
authorBenjamin Otte <otte@redhat.com>
Mon, 14 Jan 2019 01:12:02 +0000 (02:12 +0100)
committerBenjamin Otte <otte@redhat.com>
Mon, 14 Jan 2019 01:14:11 +0000 (02:14 +0100)
The tree is not needed to walk around the nodes.

It is however still needed for anything that requires modifying the
tree.

There is no immediate benefit in changing this API, but there might be
situations in the future where we can avoid looking up the tree when we
just want to check some details about the node.

gtk/gtkfilterlistmodel.c
gtk/gtkflattenlistmodel.c
gtk/gtkmaplistmodel.c
gtk/gtkrbtree.c
gtk/gtkrbtreeprivate.h
gtk/gtktreelistmodel.c
testsuite/gtk/rbtree-crash.c

index aa5abe8df21cbc3aa33aa05854efd40ef2e8a23b..8f515b5b9c1294f426ca35c5958f83b933df6327 100644 (file)
@@ -92,7 +92,7 @@ gtk_filter_list_model_get_nth_filtered (GtkRbTree *tree,
 
   while (node)
     {
-      tmp = gtk_rb_tree_get_left (tree, node);
+      tmp = gtk_rb_tree_node_get_left (node);
       if (tmp)
         {
           FilterAugment *aug = gtk_rb_tree_get_augment (tree, tmp);
@@ -114,7 +114,7 @@ gtk_filter_list_model_get_nth_filtered (GtkRbTree *tree,
 
       unfiltered++;
 
-      node = gtk_rb_tree_get_right (tree, node);
+      node = gtk_rb_tree_node_get_right (node);
     }
 
   if (out_unfiltered)
@@ -136,7 +136,7 @@ gtk_filter_list_model_get_nth (GtkRbTree *tree,
 
   while (node)
     {
-      tmp = gtk_rb_tree_get_left (tree, node);
+      tmp = gtk_rb_tree_node_get_left (node);
       if (tmp)
         {
           FilterAugment *aug = gtk_rb_tree_get_augment (tree, tmp);
@@ -156,7 +156,7 @@ gtk_filter_list_model_get_nth (GtkRbTree *tree,
       if (node->visible)
         filtered++;
 
-      node = gtk_rb_tree_get_right (tree, node);
+      node = gtk_rb_tree_node_get_right (node);
     }
 
   if (out_filtered)
@@ -280,7 +280,7 @@ gtk_filter_list_model_items_changed_cb (GListModel         *model,
   filter_removed = 0;
   for (i = 0; i < removed; i++)
     {
-      FilterNode *next = gtk_rb_tree_get_next (self->items, node);
+      FilterNode *next = gtk_rb_tree_node_get_next (node);
       if (node->visible)
         filter_removed++;
       gtk_rb_tree_remove (self->items, node);
@@ -677,7 +677,7 @@ gtk_filter_list_model_refilter (GtkFilterListModel *self)
   n_was_visible = 0;
   for (i = 0, node = gtk_rb_tree_get_first (self->items);
        node != NULL;
-       i++, node = gtk_rb_tree_get_next (self->items, node))
+       i++, node = gtk_rb_tree_node_get_next (node))
     {
       visible = gtk_filter_list_model_run_filter (self, i);
       if (visible == node->visible)
@@ -691,7 +691,7 @@ gtk_filter_list_model_refilter (GtkFilterListModel *self)
         }
 
       node->visible = visible;
-      gtk_rb_tree_mark_dirty (self->items, node);
+      gtk_rb_tree_node_mark_dirty (node);
       first_change = MIN (n_is_visible, first_change);
       if (visible)
         n_is_visible++;
index 58852061e296f840ea629b612598e6eb7a5a8a36..c8d5118c9bdb71948346d6697c1b5667775c3a69 100644 (file)
@@ -88,7 +88,7 @@ gtk_flatten_list_model_get_nth (GtkRbTree *tree,
 
   while (node)
     {
-      tmp = gtk_rb_tree_get_left (tree, node);
+      tmp = gtk_rb_tree_node_get_left (node);
       if (tmp)
         {
           FlattenAugment *aug = gtk_rb_tree_get_augment (tree, tmp);
@@ -105,7 +105,7 @@ gtk_flatten_list_model_get_nth (GtkRbTree *tree,
         break;
       position -= model_n_items;
 
-      node = gtk_rb_tree_get_right (tree, node);
+      node = gtk_rb_tree_node_get_right (node);
     }
 
   if (model_position)
@@ -127,7 +127,7 @@ gtk_flatten_list_model_get_nth_model (GtkRbTree *tree,
 
   while (node)
     {
-      tmp = gtk_rb_tree_get_left (tree, node);
+      tmp = gtk_rb_tree_node_get_left (node);
       if (tmp)
         {
           FlattenAugment *aug = gtk_rb_tree_get_augment (tree, tmp);
@@ -145,7 +145,7 @@ gtk_flatten_list_model_get_nth_model (GtkRbTree *tree,
       position--;
       before += g_list_model_get_n_items (node->model);
 
-      node = gtk_rb_tree_get_right (tree, node);
+      node = gtk_rb_tree_node_get_right (node);
     }
 
   if (items_before)
@@ -220,13 +220,13 @@ gtk_flatten_list_model_items_changed_cb (GListModel          *model,
   GtkFlattenListModel *self = node->list;
   guint real_position;
 
-  gtk_rb_tree_mark_dirty (self->items, node);
+  gtk_rb_tree_node_mark_dirty (node);
 
   for (real_position = position;
-       (parent = gtk_rb_tree_get_parent (self->items, node)) != NULL;
+       (parent = gtk_rb_tree_node_get_parent (node)) != NULL;
        node = parent)
     {
-      FlattenNode *left = gtk_rb_tree_get_left (self->items, parent);
+      FlattenNode *left = gtk_rb_tree_node_get_left (parent);
       if (left != node)
         {
           if (left)
@@ -366,7 +366,7 @@ gtk_flatten_list_model_model_items_changed_cb (GListModel          *model,
   real_removed = 0;
   for (i = 0; i < removed; i++)
     {
-      FlattenNode *next = gtk_rb_tree_get_next (self->items, node);
+      FlattenNode *next = gtk_rb_tree_node_get_next (node);
       real_removed += g_list_model_get_n_items (node->model);
       gtk_rb_tree_remove (self->items, node);
       node = next;
index 9be8aa792247da50493825e52e49a525be25dbbd..1fbf526f58368cd84416d265baa84cb303e0e039 100644 (file)
@@ -95,7 +95,7 @@ gtk_map_list_model_get_nth (GtkRbTree *tree,
 
   while (node)
     {
-      tmp = gtk_rb_tree_get_left (tree, node);
+      tmp = gtk_rb_tree_node_get_left (node);
       if (tmp)
         {
           MapAugment *aug = gtk_rb_tree_get_augment (tree, tmp);
@@ -114,7 +114,7 @@ gtk_map_list_model_get_nth (GtkRbTree *tree,
         }
       position -= node->n_items;
 
-      node = gtk_rb_tree_get_right (tree, node);
+      node = gtk_rb_tree_node_get_right (node);
     }
 
   if (out_start_pos)
@@ -168,7 +168,7 @@ gtk_map_list_model_get_item (GListModel *list,
       MapNode *before = gtk_rb_tree_insert_before (self->items, node);
       before->n_items = position - offset;
       node->n_items -= before->n_items;
-      gtk_rb_tree_mark_dirty (self->items, node);
+      gtk_rb_tree_node_mark_dirty (node);
     }
 
   if (node->n_items > 1)
@@ -176,7 +176,7 @@ gtk_map_list_model_get_item (GListModel *list,
       MapNode *after = gtk_rb_tree_insert_after (self->items, node);
       after->n_items = node->n_items - 1;
       node->n_items = 1;
-      gtk_rb_tree_mark_dirty (self->items, node);
+      gtk_rb_tree_node_mark_dirty (node);
     }
 
   node->item = self->map_func (g_list_model_get_item (self->model, position), self->user_data);
@@ -225,7 +225,7 @@ gtk_map_list_model_items_changed_cb (GListModel      *model,
       end = start + node->n_items;
       if (start == position && end <= position + removed)
         {
-          MapNode *next = gtk_rb_tree_get_next (self->items, node);
+          MapNode *next = gtk_rb_tree_node_get_next (node);
           removed -= node->n_items;
           gtk_rb_tree_remove (self->items, node);
           node = next;
@@ -236,16 +236,16 @@ gtk_map_list_model_items_changed_cb (GListModel      *model,
             {
               node->n_items -= removed;
               removed = 0;
-              gtk_rb_tree_mark_dirty (self->items, node);
+              gtk_rb_tree_node_mark_dirty (node);
             }
           else if (start < position)
             {
               guint overlap = node->n_items - (position - start);
               node->n_items -= overlap;
-              gtk_rb_tree_mark_dirty (self->items, node);
+              gtk_rb_tree_node_mark_dirty (node);
               removed -= overlap;
               start = position;
-              node = gtk_rb_tree_get_next (self->items, node);
+              node = gtk_rb_tree_node_get_next (node);
             }
         }
     }
@@ -258,7 +258,7 @@ gtk_map_list_model_items_changed_cb (GListModel      *model,
         node = gtk_rb_tree_insert_after (self->items, node);
 
       node->n_items += added;
-      gtk_rb_tree_mark_dirty (self->items, node);
+      gtk_rb_tree_node_mark_dirty (node);
     }
 
   g_list_model_items_changed (G_LIST_MODEL (self), position, removed, added);
@@ -489,7 +489,7 @@ gtk_map_list_model_init_items (GtkMapListModel *self)
         {
           MapNode *node = gtk_rb_tree_insert_before (self->items, NULL);
           node->n_items = g_list_model_get_n_items (self->model);
-          gtk_rb_tree_mark_dirty (self->items, node);
+          gtk_rb_tree_node_mark_dirty (node);
         }
     }
   else
index 14b017f18160652333b6241c7b18d9b511d18a28..4e521892330619290fa7127cc5e7dec9352484dc 100644 (file)
@@ -536,15 +536,13 @@ gtk_rb_tree_get_last (GtkRbTree *tree)
 }
 
 gpointer
-gtk_rb_tree_get_previous (GtkRbTree *tree,
-                          gpointer   node)
+gtk_rb_tree_node_get_previous (gpointer node)
 {
   return NODE_TO_POINTER (gtk_rb_node_get_previous (NODE_FROM_POINTER (node)));
 }
 
 gpointer
-gtk_rb_tree_get_next (GtkRbTree *tree,
-                      gpointer   node)
+gtk_rb_tree_node_get_next (gpointer node)
 {
   return NODE_TO_POINTER (gtk_rb_node_get_next (NODE_FROM_POINTER (node)));
 }
@@ -556,22 +554,19 @@ gtk_rb_tree_get_root (GtkRbTree *tree)
 }
 
 gpointer
-gtk_rb_tree_get_parent (GtkRbTree *tree,
-                        gpointer   node)
+gtk_rb_tree_node_get_parent (gpointer node)
 {
   return NODE_TO_POINTER (parent (NODE_FROM_POINTER (node)));
 }
 
 gpointer
-gtk_rb_tree_get_left (GtkRbTree *tree,
-                      gpointer   node)
+gtk_rb_tree_node_get_left (gpointer node)
 {
   return NODE_TO_POINTER (NODE_FROM_POINTER (node)->left);
 }
 
 gpointer
-gtk_rb_tree_get_right (GtkRbTree *tree,
-                       gpointer   node)
+gtk_rb_tree_node_get_right (gpointer node)
 {
   return NODE_TO_POINTER (NODE_FROM_POINTER (node)->right);
 }
@@ -594,8 +589,7 @@ gtk_rb_tree_node_get_tree (gpointer node)
 }
 
 void
-gtk_rb_tree_mark_dirty (GtkRbTree *tree,
-                        gpointer   node)
+gtk_rb_tree_node_mark_dirty (gpointer node)
 {
   gtk_rb_node_mark_dirty (NODE_FROM_POINTER (node), TRUE);
 }
index 8e74c5e19e94438e3727efa56d59531d77352bc5..45aba5cc2d38834de16a7bc7aa1af103f4ebd01a 100644 (file)
@@ -45,25 +45,19 @@ GtkRbTree *          gtk_rb_tree_new_for_size           (gsize
 GtkRbTree *          gtk_rb_tree_ref                    (GtkRbTree               *tree);
 void                 gtk_rb_tree_unref                  (GtkRbTree               *tree);
 
+gpointer             gtk_rb_tree_get_root               (GtkRbTree               *tree);
 gpointer             gtk_rb_tree_get_first              (GtkRbTree               *tree);
 gpointer             gtk_rb_tree_get_last               (GtkRbTree               *tree);
-gpointer             gtk_rb_tree_get_previous           (GtkRbTree               *tree,
-                                                         gpointer                 node);
-gpointer             gtk_rb_tree_get_next               (GtkRbTree               *tree,
-                                                         gpointer                 node);
 
-gpointer             gtk_rb_tree_get_root               (GtkRbTree               *tree);
-gpointer             gtk_rb_tree_get_parent             (GtkRbTree               *tree,
-                                                         gpointer                 node);
-gpointer             gtk_rb_tree_get_left               (GtkRbTree               *tree,
-                                                         gpointer                 node);
-gpointer             gtk_rb_tree_get_right              (GtkRbTree               *tree,
-                                                         gpointer                 node);
-gpointer             gtk_rb_tree_get_augment            (GtkRbTree               *tree,
-                                                         gpointer                 node);
+gpointer             gtk_rb_tree_node_get_previous      (gpointer                 node);
+gpointer             gtk_rb_tree_node_get_next          (gpointer                 node);
+gpointer             gtk_rb_tree_node_get_parent        (gpointer                 node);
+gpointer             gtk_rb_tree_node_get_left          (gpointer                 node);
+gpointer             gtk_rb_tree_node_get_right         (gpointer                 node);
 GtkRbTree *          gtk_rb_tree_node_get_tree          (gpointer                 node);
+void                 gtk_rb_tree_node_mark_dirty        (gpointer                 node);
 
-void                 gtk_rb_tree_mark_dirty             (GtkRbTree               *tree,
+gpointer             gtk_rb_tree_get_augment            (GtkRbTree               *tree,
                                                          gpointer                 node);
 
 gpointer             gtk_rb_tree_insert_before          (GtkRbTree               *tree,
index af609e61ce8f01fbf026cb2d23a9fbd6c2809e5a..f74d61f6d96cc678e7570f0a81a96c3810b80be8 100644 (file)
@@ -121,7 +121,7 @@ tree_node_get_nth_child (TreeNode *node,
 
   while (child)
     {
-      tmp = gtk_rb_tree_get_left (tree, child);
+      tmp = gtk_rb_tree_node_get_left (child);
       if (tmp)
         {
           aug = gtk_rb_tree_get_augment (tree, tmp);
@@ -138,7 +138,7 @@ tree_node_get_nth_child (TreeNode *node,
 
       position--;
 
-      child = gtk_rb_tree_get_right (tree, child);
+      child = gtk_rb_tree_node_get_right (child);
     }
 
   return NULL;
@@ -170,7 +170,7 @@ tree_node_get_local_position (GtkRbTree *tree,
   TreeAugment *left_aug;
   guint n;
   
-  left = gtk_rb_tree_get_left (tree, node);
+  left = gtk_rb_tree_node_get_left (node);
   if (left)
     {
       left_aug = gtk_rb_tree_get_augment (tree, left);
@@ -181,11 +181,11 @@ tree_node_get_local_position (GtkRbTree *tree,
       n = 0;
     }
 
-  for (parent = gtk_rb_tree_get_parent (tree, node);
+  for (parent = gtk_rb_tree_node_get_parent (node);
        parent;
-       parent = gtk_rb_tree_get_parent (tree, node))
+       parent = gtk_rb_tree_node_get_parent (node))
     {
-      left = gtk_rb_tree_get_left (tree, parent);
+      left = gtk_rb_tree_node_get_left (parent);
       if (left == node)
         {
           /* we are the left node, nothing changes */
@@ -220,18 +220,18 @@ tree_node_get_position (TreeNode *node)
     {
       tree = node->parent->children;
 
-      left = gtk_rb_tree_get_left (tree, node);
+      left = gtk_rb_tree_node_get_left (node);
       if (left)
         {
           left_aug = gtk_rb_tree_get_augment (tree, left);
           n += left_aug->n_items;
         }
 
-      for (parent = gtk_rb_tree_get_parent (tree, node);
+      for (parent = gtk_rb_tree_node_get_parent (node);
            parent;
-           parent = gtk_rb_tree_get_parent (tree, node))
+           parent = gtk_rb_tree_node_get_parent (node))
         {
-          left = gtk_rb_tree_get_left (tree, parent);
+          left = gtk_rb_tree_node_get_left (parent);
           if (left == node)
             {
               /* we are the left node, nothing changes */
@@ -262,7 +262,7 @@ tree_node_mark_dirty (TreeNode *node)
        !node->is_root;
        node = node->parent)
     {
-      gtk_rb_tree_mark_dirty (node->parent->children, node);
+      gtk_rb_tree_node_mark_dirty (node);
     }
 }
 
@@ -283,7 +283,7 @@ gtk_tree_list_model_get_nth (GtkTreeListModel *self,
 
   while (TRUE)
     {
-      tmp = gtk_rb_tree_get_left (tree, node);
+      tmp = gtk_rb_tree_node_get_left (node);
       if (tmp)
         {
           TreeAugment *aug = gtk_rb_tree_get_augment (tree, tmp);
@@ -309,7 +309,7 @@ gtk_tree_list_model_get_nth (GtkTreeListModel *self,
         }
       position -= n_children;
 
-      node = gtk_rb_tree_get_right (tree, node);
+      node = gtk_rb_tree_node_get_right (node);
     }
 
   g_return_val_if_reached (NULL);
@@ -406,7 +406,7 @@ gtk_tree_list_model_items_changed_cb (GListModel *model,
       for (i = 0; i < removed; i++)
         {
           tmp = child;
-          child = gtk_rb_tree_get_next (node->children, child);
+          child = gtk_rb_tree_node_get_next (child);
           gtk_rb_tree_remove (node->children, tmp);
         }
     }
@@ -426,7 +426,7 @@ gtk_tree_list_model_items_changed_cb (GListModel *model,
       for (i = 0; i < added; i++)
         {
           tree_added += gtk_tree_list_model_expand_node (self, child);
-          child = gtk_rb_tree_get_next (node->children, child);
+          child = gtk_rb_tree_node_get_next (child);
         }
     }
 
index ec46c4544515788c6ce532482d35fc0006d24294..a4b641fea6f15fa2ec3abf52c0c7b75372305fd5 100644 (file)
@@ -70,7 +70,7 @@ get (GtkRbTree *tree,
 
   while (node)
     {
-      tmp = gtk_rb_tree_get_left (tree, node);
+      tmp = gtk_rb_tree_node_get_left (node);
       if (tmp)
         {
           Aug *aug = gtk_rb_tree_get_augment (tree, tmp);
@@ -86,7 +86,7 @@ get (GtkRbTree *tree,
         break;
       pos--;
 
-      node = gtk_rb_tree_get_right (tree, node);
+      node = gtk_rb_tree_node_get_right (node);
     }
 
   return node;
@@ -119,12 +119,12 @@ print_node (GtkRbTree  *tree,
 {
   Node *child;
 
-  child = gtk_rb_tree_get_left (tree, node);
+  child = gtk_rb_tree_node_get_left (node);
   if (child)
     n = print_node (tree, child, depth + 1, "/", n);
   g_print ("%*s %u\n", 2 * depth, prefix, n);
   n++;
-  child = gtk_rb_tree_get_right (tree, node);
+  child = gtk_rb_tree_node_get_right (node);
   if (child)
     n = print_node (tree, child, depth + 1, "\\", n);